package com.waya.demo.aop.DynamicAop.java;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * 
 * 功能接口（interface）、实体对象、Proxy类（用来动态生成代理类）、程序调用处理器（InvocationHandler)

	接口和实体对象上面已经介绍过，下面介绍下新朋友
	
	static Class<?> getProxyClass(ClassLoader  loader,Class<?>...   interfaces)       返回一个实现了给定接口的代理类 
	static  Object  newProxyInstance(ClassLoader  loader,Class<?>[]  interfaces,InvocationHandler handler)
	
	返回一个实现了所有给定接口的代理类的实例对象，所有的方法都会通过给定的handler对象当中的invoke方法去执行
	static boolean  isProxyClass(Class<?>  cl)   判断是否为一个代理对象
	
	Object  invoke(Objectproxy,Method  method,Object[] args)
	
	定义此方法以包含每当代理对象上的方法被调用时要执行的操作
	
	创建动态代理的步骤:
	1创建动态代理的接口（抽象类）和类
	2创建实现了InvocationHandler接口的程序处理器类，对目标接口中的所有方法统一处理
	3调用Proxy的静态方法newProxyInstance创建并生成相应的代理对象
	4使用代理类
 *
 */
public class TraceHandler implements InvocationHandler {

	private  Object target;
	 
    public TraceHandler(Object obj) {
        this.target = obj;
    }

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println(target);
        System.out.println(proxy.getClass());
        System.out.println(method);
        System.out.print("."+method.getName()+" (");
        if(args != null){
            for (int i=0; i< args.length; i++){
                System.out.println(args[i]);
                if(i<args.length-1){
                    System.out.print(", ");
                }
            }
        }
        System.out.println(")");
 
        return method.invoke(target,args);
    }


}
